package entidades;

import gestordeentidades.persistance.DataBaseObject;
import entidades.interfaces.IEstilo;
import entidades.util.RandomString;
import java.util.Objects;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;

/**
 * Trabalho DAS - 2014/2015
 * @author a21210380, a21190325, a21210392
 */
public class Estilo extends DataBaseObject implements IEstilo {
    private ObjectProperty<Cor> corLinha;
    private ObjectProperty<Cor> corTexto;
    private ObjectProperty<Textura> fundo;
    private String nome;
    private Familia familia;

    public Estilo(Familia familia, String nome, Cor corLinha, Cor corTexto, Textura fundo) {
        if(familia == null)
            throw new NullPointerException("familia não pode ser null");
        if(nome == null)
            throw new NullPointerException("nome não pode ser null");
        if(corLinha == null)
            throw new NullPointerException("corLinha não pode ser null");
        if(corTexto == null)
            throw new NullPointerException("corTexto não pode ser null");
        if(fundo == null)
            throw new NullPointerException("fundo não pode ser null");
        this.familia = familia;
        this.corLinha = new SimpleObjectProperty<>(corLinha);
        this.corTexto = new SimpleObjectProperty<>(corTexto);
        this.fundo = new SimpleObjectProperty<>(fundo);
        this.nome = nome;
    }
    
    public Estilo(TelhaBase telhaBase) {
        this.familia = telhaBase.getFamilia();
        this.corLinha = new SimpleObjectProperty<>(telhaBase.getCorDaLinha());
        this.corTexto = new SimpleObjectProperty<>(telhaBase.getCorDoTexto());
        this.fundo = new SimpleObjectProperty<>(telhaBase.getFundo());
        this.nome = telhaBase.getNomeDoEstilo();
    }
    
    public Estilo(Familia familia) {
        this.familia = familia;
        this.corLinha = new SimpleObjectProperty<>(familia.getCorLinhaDefault());
        this.corTexto = new SimpleObjectProperty<>(familia.getCorTextoDefault());
        this.fundo = new SimpleObjectProperty<>(familia.getFundoDefault());
        this.nome = RandomString.obterString(10);
        
    }

    @Override
    public String toString() {
        return nome;
    }
    
    @Override
    public Cor getCorDaLinha() {
        return corLinha.getValue();
    }

    @Override
    public Cor getCorDoTexto() {
        return corTexto.getValue();
    }

    @Override
    public Textura getFundo() {
        return fundo.getValue();
    }

    @Override
    public void setCorDaLinha(Cor cor) {
        if(cor == null)
            throw new NullPointerException("corLinha não pode ser null");
        this.corLinha.setValue(cor);
    }

    @Override
    public void setCorDoTexto(Cor cor) {
        if(cor == null)
            throw new NullPointerException("corTexto não pode ser null");
        this.corTexto.setValue(cor);
    }

    @Override
    public void setFundo(Textura textura) {
        if(textura == null)
            throw new NullPointerException("textura não pode ser null");
        this.fundo.setValue(textura);
    }

    @Override
    public String getNomeDoEstilo() {
        return nome;
    }

    @Override
    public void setNomeDoEstilo(String nome) {
        if(nome == null)
            throw new NullPointerException("nome não pode ser null");
        this.nome = nome;
    }
    
    public Familia getFamilia() {
        return familia;
    }
    
    public Estilo setFamilia(Familia familia) {
        if(familia == null)
            throw new NullPointerException("familia não pode ser null");
        this.familia = familia;
        return this;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (obj == this) {
            return true;
        }
        if (obj instanceof Estilo) {
            Estilo c = (Estilo) obj;
            return getCorDaLinha().equals(c.getCorDaLinha()) && 
                    getCorDoTexto().equals(c.getCorDoTexto()) && 
                    getFundo().equals(c.getFundo()) &&
                    getFamilia().equals(c.getFamilia()) &&
                    getNomeDoEstilo().equals(c.getNomeDoEstilo()) ;
        }
        return false;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 47 * hash + Objects.hashCode(this.getCorDaLinha());
        hash = 47 * hash + Objects.hashCode(this.getCorDoTexto());
        hash = 47 * hash + Objects.hashCode(this.getFundo());
        hash = 47 * hash + Objects.hashCode(this.getFamilia());
        hash = 47 * hash + Objects.hashCode(this.getNomeDoEstilo());
        return hash;
    }
    
    public ObjectProperty<Cor> corLinhaProperty() {
        return corLinha;
    }
    
    public ObjectProperty<Cor> corTextoProperty() {
        return corTexto;
    }
    
    public ObjectProperty<Textura> fundoProperty() {
        return fundo;
    }
}
